package jk.zmn.thread.create;

/**
 * @author 张梦楠
 * @Title: ${file_name}
 * @Package ${package_name}
 * @Description: ${todo}
 * @date 2018/5/2614:32
 * @blog www.itzmn.com
 *
 * 静态代理相关：
 *      什么是静态代理，
 *
 *   对原有对象的不满意，想增强功能有三种方式
 *      继承：
 *          继承原有类，加上更多功能得到新的类，但是如果后来需要很多功能，会继承很多类，层级过高
 *      包装
 *          原理也是代理
 *      代理
 *          新建一个代理类，实现原有接口，对对象进行增强
 *
 *
 * 静态代理：
 *      需要有原有对象，
 *      代理对象
 *      公共接口
 */
public class StaticProxy {

     public static void main(String[] args) {
         Man man = new Man("张三");
        // man.coding();

         ProxyMan proxyMan = new ProxyMan(man);
         proxyMan.coding();
     }

}

/**
 * 程序员接口，敲代码的方法
 */
interface Programer{
    void coding();
}

class Man implements Programer{
    public String name;

    public String getName() {
        return name;
    }

    public Man(String name) {
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void coding() {
        System.out.println(name+"正在辛苦的敲代码");
    }
}

class ProxyMan implements Programer{

    public Man man;

    public ProxyMan(Man man) {
        this.man = man;
    }

    @Override
    public void coding() {
        startComputer();
        System.out.println(man.getName()+"正在辛苦的敲代码");
        closeComputer();
    }

    private void closeComputer() {
        System.out.println(man.getName()+"关闭了电脑");
    }

    private void startComputer() {
        System.out.println(man.getName()+"开启电脑");
    }
}